import time as tm

from datetime import datetime, time
from loguru import logger
from sio_agv.agv_socket import AGV
from app.core.conf import ST
# from tornado.error import tornadoAGV  
from tornado.limit import Tornado
from app.common.battery_log import battery_log

batteryTornado = Tornado("battery", 3 , 10 * 60)

bat_lev_low = 0.30
bat_lev_high = 0.95

bat_lev_temp = 50 

# 标识正在执行充电任务，当发送过充电的任务指令之后，立马将此值设置为True，当检测到charging为True，立马将值设置为False
is_running_charge = False

# 充电任务的导航暂停计时
nav_pause_counter = 0



def handle_battery_charge(all1):
    global bat_lev_low
    global is_running_charge
    global nav_pause_counter
    global bat_lev_temp
    global test


    battery_temp = all1.get('battery_temp') # 站点名称
    voltage = all1.get('voltage') # 站点名称
    current= all1.get('current') # 站点名称

    # battery_log.debug(f'battery_temp={battery_temp}');
    # battery_log.debug(f'voltage={voltage}');
    # battery_log.debug(f'current={current}');


    # do6关闭则不充电
    do = all1.get("DO")

    if battery_temp > bat_lev_temp:
        # 如果已经关闭充电继电器，则返回，不需要在继续发送龙卷风,和再次关闭继电器
        if do[6].get('status') == False:
            return
        batteryTornado.send(f'电池温度大于{bat_lev_temp}度，系统停止充电,请值班帮忙查看ヽ(｡◕‿◕｡)ﾉﾟ')
        logger.debug(f'电池温度大于{bat_lev_temp}度，系统停止充电');
        tt15 = AGV.get_agv(ST.AGV_IP)
        # 首先抢占控制权
        tt15.send('config',1,4005,{"nick_name":"alice"})
        # 关闭继电器
        tt15.send('other',1,6001,{'id':6,"status":True})
        # 导航到201站点
        tt15.send('nav',1,3051,{'id':"LM201"})
        # 充电任务flag设置false 
        is_running_charge = False
        # 然后直接AGV直接关机好了
        return 

    target_id = all1.get('target_id') # 站点名称
    current_station = all1.get('current_station') # 站点名称
    last_station = all1.get("last_station")

    battery_level =all1.get('battery_level')
    charging = all1.get('charging')
    # 如果正在导航去充电，一般来说，10分钟内是能够走到这个充电桩的，所以这个检查其实有点多余
    nav_status = all1.get('task_status')#站点的导航状态 

    task_status = all1.get('tasklist_status').get('taskListStatus')
    task_name = all1.get('tasklist_status').get('taskListName')


    if battery_level < 0.1 and charging ==False:

        if nav_status==2:
            logger.debug('电量低于10%,可能是充电导航');
            return

        batteryTornado.send("车子电量小于10%，第一次充电指令发送失败，再次发送充电指令")
        goto_charge()
        return


    if nav_status==2:
        logger.debug('正在导航');
        return

    if task_status==2:
        logger.debug(f'正在执行别的任务{task_name}');
        return


    # 如果正在充电，则返回，不要再进行后面的操作
    if charging:
        is_running_charge = False
        logger.info(f'正在充电{battery_level}，不要操作')
        # 如果电量冲到95%,就往前走走,不要待在充电站呢里
        if battery_level > bat_lev_high:
            logger.debug(f'{battery_level}大于0.95,充电完成');
            goaway_charge()
        return 
   

    if battery_level > bat_lev_low:
        logger.info(f'电量{battery_level} > {bat_lev_low}，no charge')
        return 


    if is_running_charge:
        if nav_status == 3 :
            logger.debug('充电任务暂停中,开启一个计时器，如果长时间暂停，则发送继续指令'); 
            current_datetime = datetime.now()  # 获取当前日期和时间
            work_start_time = "08:00:00"  # 上班开始时间
            work_end_time = "20:00:00"  # 上班结束时间
            # 将字符串格式的时间转换为时间对象
            start_time = time(*tm.strptime(work_start_time, "%H:%M:%S")[3:6])
            end_time = time(*tm.strptime(work_end_time, "%H:%M:%S")[3:6])
            # 将当前日期和时间中的时间部分提取出来
            current_time = current_datetime.time()
            if start_time <= current_time <= end_time:
                logger.debug("当前在上班时间内，充电导航被暂停,发个龙卷风")
                batteryTornado.send("当前在上班时间内，充电导航被暂停,发个龙卷风")
            else:
                logger.debug("当前在非上班时间内,充电导航被暂停")
                nav_pause_counter = nav_pause_counter + 1
                if nav_pause_counter > 1200:
                    logger.debug('暂停时间达到10min,继续导航(可能误导航，导致暂停）');
                    tt15 = AGV.get_agv(ST.AGV_IP)
                    tt15.send('nav',1,3002)
                    res = tt15.receive('nav')
            return

        if task_name!='task_charge':
            logger.debug('充电指令下达失败，重新下达');
            goto_charge()
        return

    logger.debug(target_id)
    logger.debug(target_id=='')

    # current_station
    logger.debug(current_station)
    logger.debug(current_station=='')

    if current_station == '':
        logger.debug('无法获取AGV当前站点，需要进一步判断目标站点');
        if not int(target_id.split('LM')[1])>=200:
            logger.debug('目标站点位于非充电线路，发送龙卷风');
            batteryTornado.send('目标站点非充电线路上,请手动驾驶到充电线路上面的(♥◠‿◠)ﾉ')
            return
        else:
            pass

    else:
        if not int(current_station.split('LM')[1])>=200:
            logger.debug('当前位置位于非充电线路，发送龙卷风');
            batteryTornado.send('巡检AGV位于非充电线路上,请手动驾驶到充电线路上面的(♥◠‿◠)ﾉ')
            return 

    goto_charge()
    is_running_charge = True

    
def goto_charge():
    logger.debug('导航去充电')
    tt15 = AGV.get_agv(ST.AGV_IP)
    # 首先抢占控制权
    tt15.send('config',1,4005,{"nick_name":"alice"})
    tt15.send('nav',1,3106,{"name":"task_charge"})


def goaway_charge():
    logger.debug('离开充电站')
    tt15 = AGV.get_agv(ST.AGV_IP)
    # 首先抢占控制权
    tt15.send('config',1,4005,{"nick_name":"alice"})
    tt15.send('nav',1,3051,{'id':"LM201"})
    # 然后关闭继电器
    tt15.send('other',1,6001,{'id':6,"status":True})


  

def is_non_work_time():  
    pass
    
        # 在这里执行你需要的操作  
        # 例如：调用函数或执行其他任务  
        # your_function()  




